//此文件的作用主要有以下三点

//1、负责把this.$data选项的属性转换成响应式的

//2、data中的某个属性也是对象,把该属性转换成响应式数据

//3、数据变化发送通知

class Observer {
    //注意此处的data是this.$data,this.$data并没有getter方法和setter方法
    constructor(data) {
        this.walk(data)
    }
    walk(data) {
        //逻辑判断data是否为空, 逻辑判断data的数据类型是否为object
        if (!data || typeof (data) !== 'object') {
            return
        };
        //通过object.keys方法遍历传入的data数据
        Object.keys(data).forEach(key => {
            //此处调用defineReactive方法传入三个参数,分别是data对象,data对象的key, //data[key] 也就是data里面的值
            this.defineReactive(data, key, data[key])
        });
    }
    defineReactive(obj, key, value) {

        //保存当前this
        let that = this;

        let dep = new Dep()

        //如果value是对象,把value转换成响应式对象
        this.walk(value);
        //给传入的this.$data添加getter和setter方法
        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get() {
                //收集依赖 
                Dep.target && dep.addSubs(Dep.target);

                return value
            },
            set(newValue) {
                if (newValue === value) {
                    return
                }
                value = newValue;
                //设置新的值的时候调用此方法,进行添加getter和setter
                that.walk(newValue)
                //发送通知
                dep.notify()
            }
        })
    }
}
